---
id: module-dev
title: 28. 模块化开发
sidebar_label: 28. 模块化开发
---

:::important 特别注意

以下的模块化配置必须在 `appsettings.json` 下配置才有效，原因是启动的时候 `appsettings.json` 已经加载，自定义配置文件还未加载。

:::

## 28.1 关于模块化开发

模块化是代码的组成的一种方式，模块化系统就像乐高玩具一样，一块一块零散积木堆积起一个精彩的世界。每种积木的形状各不相同，功能各不相同，积木与积木直接互相依赖，互相支撑。

### 28.1.1 模块化开发好处

模块化开发能够将不同的功能组装在一起，实现功能的累加，诸多功能组装在一起，最终形成项目。

## 28.2 模块分类

- `应用程序模块`：通常这类模块是完整的应用程序，可以独立运行，有自己的实体、服务、API 及 UI 组件等。
- `框架级模块`：这类通常是解决某个业务功能进行开发的模块，比如上传文件、分布式缓存、数据验证等。

## 28.3 如何进行模块化开发

在 `Furion` 框架设计之初就考虑到模块化开发，所以从最初版本就具备此功能。启用 `Furion` 模块化支持非常简单。

### 28.3.1 启用模块化支持

```json {2,3,4}
{
  "AppSettings": {
    "EnabledReferenceAssemblyScan": true,    // 启用模块化程序集扫描
    "SupportPackageNamePrefixs": ["Module1", "Module2",...] // 配置通过 Nuget 方式安装的模块化包，如果不是通过 Nuget 方式可不配置
    // "ExternalAssemblies": ["plugins/Module1.dll", "plugins/Module2.dll", ...]   // 配置加载网站 plugins 目录下的模块程序集，可不配置
  }
}
```

### 28.3.2 各种添加模块配置方式

添加模块到现有的应用中有多种方式：

1. **直接通过项目添加模块化引用或编辑 `.csproj` 添加模块**

这种方式无需任何配置，`Furion` 框架可自动加载模块。

2. **通过添加 `.dll` 方式引用模块**

需要配置 `EnabledReferenceAssemblyScan` 节点，如：

```json {3}
{
  "AppSettings": {
    "EnabledReferenceAssemblyScan": true
  }
}
```

3. **通过 `Nuget` 方式安装模块**

如果通过 `Nuget` 方式安装模块，需要配置 `SupportPackageNamePrefixs` 节点，如：

```json {3}
{
  "AppSettings": {
    "SupportPackageNamePrefixs": ["Nuget包名称", "Nuget包名称",...]
  }
}
```

4. **通过动态加载 `.dll` 方式安装模块**

这种方式通常是在网站创建一个文件夹放入模块化 `.dll` 文件，如：`plugins`，无需添加引用可自动加载。

```json {3}
{
  "AppSettings": {
    "ExternalAssemblies": ["plugins/Module1.dll", "plugins/Module2.dll", ...]
  }
}
```

:::important 特别注意

如果非生产环境，那么 `plugins` 文件夹放在 `bin\Debug\net5.0\` 或 `bin\Release\net5.0` 目录下。

如果是生产环境，则直接放在根目录即可。

:::

## 28.4 模块化开发注意事项

- 尽可能保证每个模块都有独立的路由地址格式：`/模块化名称/路由地址`，这样才能保证不会和现有的系统出现冲突。
- 开发模块化是尽可能设计为完全独立的引用，**如果需要包含 UI 元素如视图、html/cs/javascript 应采用嵌入式方式**。
- 模块化开发如果需要添加第三方服务，应配置在 `AppStartup` 的派生类中。
- 模块化的所在程序集的注释文件 `.xml` 需放在和 `.dll` 同级目录

## 28.5 关于热插拔机制

在 `Furion v2.4.0 +` 版本之后，**框架移除了热加载和热卸载模块的功能**，原因是目前微软提供的 `AssemblyLoadContext + 文件夹监听` 处理 `.dll` 运行时热拔插机制还未成熟，此功能将在 `.NET6` 版本得到改善。

也就是，自 `v2.4.0+` 版本之后，`Furion` 框架只提供在启动时加载模块，不在运行时进行任何处理。

## 28.6 反馈与建议

:::note 与我们交流

给 Furion 提 [Issue](https://gitee.com/dotnetchina/Furion/issues/new?issue)。

:::
